/** ==================================================================================== **/
/** 							Interceptor chimate $http e ajax.						 **/
/** ==================================================================================== **/


/**
 * Interceptor chimate $http.
 */
BootApplication.factory('HttpInterceptor', function ($q, configuration, $window, log) {

    return {
        request: function (config) {
            
        	/**
        	 * The custom "X-Requested-With" is a conventional header sent by browser clients, and it used to be the default in Angular but they took 
        	 * it out in 1.3.0. Spring Security responds to it by not sending a "WWW-Authenticate" header in a 401 response, and thus the browser will 
        	 * not pop up an authentication dialog (which is desirable in our app since we want to control the authentication).
        	 */
        	config.headers["X-Requested-With"] = 'XMLHttpRequest';
        	config.headers["X_HTTP_AJAX"] = 'OK';
        	
            return config || $q.when(config)
        },
        response: function (jqxhr) {

        	/**
    		 * L'URL per reindirizzare a se un utente viene forzatamente sloggato da policy
    		 */
        	if(jqxhr.status === 503 && jqxhr.headers("X_HTTP_REDIRECT") != null && jqxhr.headers("X_HTTP_REDIRECT") == "PolicyLogout") {
        		$window.location.href = configuration.getParam("Constants").ContextPath + "login?policyLogout";
    		}
        	/**
    		 * L'URL per reindirizzare a se un utente è stata richiesta da policy il cambio password.
    		 */
    		if(jqxhr.status === 503 && jqxhr.headers("X_HTTP_REDIRECT") != null && jqxhr.headers("X_HTTP_REDIRECT") == "ChPassword") {
    			$window.location.href = configuration.getParam("Constants").ContextPath + "chPassword?pId=" + jqxhr.headers("pId") + "&uId=" + jqxhr.headers("uId");
    		}
    		/**
    		 * L'URL per reindirizzare a se un utente tenta di accedere a una risorsa e la loro sessione è scaduta a causa di un numero 
		     * eccessivo di sessioni per l'utente corrente.
    		 */
    		if(jqxhr.status === 503 && jqxhr.headers("X_HTTP_REDIRECT") != null && jqxhr.headers("X_HTTP_REDIRECT") == "ConcurrentSessionExpired") {
    			$window.location.href = configuration.getParam("Constants").ContextPath + "login?concurrentSessionExpired";
    		}
    		/**
    		 * Sessione scaduta
    		 */
    		if(jqxhr.status === 401) $window.location.href = configuration.getParam("Constants").ContextPath + "login?expired";
    		/**
    		 * L'utente ha tentato l'accesso ad una risorsa per il cui accesso non ha i permessi
    		 */
    		if(jqxhr.status === 403) $window.location.href = configuration.getParam("Constants").ContextPath + "accessoNegato";
    		/**
    		 * L'utente ha tentato l'accesso ad una risorsa che non è stata trovata
    		 */
            if(jqxhr.status === 404) log.error("Http --> Status: " + jqxhr.status + " - " + jqxhr.statusText + " - Url: " + jqxhr.config.url);
            	//$window.location.href = configuration.getParam("Constants").ContextPath + "page404";
            
            return jqxhr || $q.when(jqxhr);
        },
        responseError: function (jqxhr) {
        	
        	/**
    		 * L'URL per reindirizzare a se un utente viene forzatamente sloggato da policy
    		 */
        	if(jqxhr.status === 503 && jqxhr.headers("X_HTTP_REDIRECT") != null && jqxhr.headers("X_HTTP_REDIRECT") == "PolicyLogout") {
        		$window.location.href = configuration.getParam("Constants").ContextPath + "login?policyLogout";
    		}
        	/**
    		 * L'URL per reindirizzare a se un utente è stata richiesta da policy il cambio password.
    		 */
    		if(jqxhr.status === 503 && jqxhr.headers("X_HTTP_REDIRECT") != null && jqxhr.headers("X_HTTP_REDIRECT") == "ChPassword") {
    			$window.location.href = configuration.getParam("Constants").ContextPath + "chPassword?pId=" + jqxhr.headers("pId") + "&uId=" + jqxhr.headers("uId");
    		}
    		/**
    		 * L'URL per reindirizzare a se un utente tenta di accedere a una risorsa e la loro sessione è scaduta a causa di un numero 
		     * eccessivo di sessioni per l'utente corrente.
    		 */
    		if(jqxhr.status === 503 && jqxhr.headers("X_HTTP_REDIRECT") != null && jqxhr.headers("X_HTTP_REDIRECT") == "ConcurrentSessionExpired") {
    			$window.location.href = configuration.getParam("Constants").ContextPath + "login?concurrentSessionExpired";
    		}
    		/**
    		 * Sessione scaduta
    		 */
    		if(jqxhr.status === 401) $window.location.href = configuration.getParam("Constants").ContextPath + "login?expired";
    		/**
    		 * L'utente ha tentato l'accesso ad una risorsa per il cui accesso non ha i permessi
    		 */
            if(jqxhr.status === 403) $window.location.href = configuration.getParam("Constants").ContextPath + "accessoNegato";
            /**
    		 * L'utente ha tentato l'accesso ad una risorsa che non è stata trovata
    		 */
            if(jqxhr.status === 404) if(jqxhr.status === 404) log.error("Http --> Status: " + jqxhr.status + " - " + jqxhr.statusText + " - Url: " + jqxhr.config.url);
            	// $window.location.href = configuration.getParam("Constants").ContextPath + "page404";
            
            return $q.reject(jqxhr);
        }
    };
});